const GROUP_NAME = 'users';
const {
  getUsers,
  addUser,
  getUserById,
  getUserLogined,
  deleteUserById,
  deleteUsersByIds,
  updateUserById,
  updateUserLogined,
  isExist,
  login,
  editAvatar,
  editPassword,
  setGroup,
} = require('../handler/usersHandler');

exports.plugin = {
  name: 'routerUsers',
  register(server) {
    const { Joi, headers } = server;
    // 设置用户权限
    const groupRoute = {
      method: 'put',
      path: `/${GROUP_NAME}/group/{id}`,
      handler: setGroup,
      config: {
        notes: '设置用户权限',
        description: '设置用户权限',
        tags: ['api', GROUP_NAME],
        plugins: {
          'hapi-swagger': {
            payloadType: 'form',
          },
        },
        validate: {
          headers,
          params: Joi.object({
            id: Joi.string().required().hex().length(24)
              .description('用户id')
              .error(() => new Error('用户id格式错误')),
          }),
          payload: Joi.object({
            group: Joi.array().required().single()
              .description('所属组：至少添加1个组')
              .error(() => new Error('至少添加1个组')),
          }),
        },
      },
    };
    // 修改当前登陆用户密码
    const passowrd = {
      method: 'put',
      path: `/${GROUP_NAME}/password`,
      handler: editPassword,
      config: {
        plugins: {
          'hapi-swagger': {
            payloadType: 'form',
          },
        },
        notes: '修改当前登陆用户密码',
        description: '修改当前登陆用户密码',
        tags: ['api', GROUP_NAME],
        validate: {
          headers,
          payload: Joi.object({
            oldPassword: Joi.string().required().description('原密码'),
            newPassword: Joi.string().required().min(6).max(18)
              .description('新密码:6-18个字符')
              .error(() => new Error('新密码:6-18个字符')),
          }),
        },
      },
    };
    // 个人头像
    const avatar = {
      method: 'post',
      path: `/${GROUP_NAME}/avatar`,
      handler: editAvatar,
      config: {
        plugins: {
          'hapi-swagger': {
            payloadType: 'form',
            consumes: 'multipart/form-data',
          },
        },
        notes: '个人头像',
        description: '个人头像',
        tags: ['api', GROUP_NAME],
        payload: {
          maxBytes: 1048576,
          parse: true,
          output: 'file',
        },
        validate: {
          headers,
          payload: Joi.object({
            file: Joi.object({
              filename: Joi.string().regex(/^.*\.((png)|(jpg))$/),
            }).unknown()
              .meta({ swaggerType: 'file' })
              .description('头像:后缀名只能是png、jpg，文件小于1M')
              .error(() => new Error('头像:后缀名只能是png、jpg，文件小于1M')),
          }),
        },
      },
    };
    server.route([
      groupRoute,
      avatar,
      passowrd,
      { // 用户登陆
        method: 'post',
        path: `/${GROUP_NAME}/login`,
        handler: login,
        config: {
          notes: '用户登陆',
          description: '用户登陆',
          tags: ['api', GROUP_NAME],
          auth: false,
          plugins: {
            'hapi-swagger': {
              payloadType: 'form',
              produces: ['text/plain'],
            },
            rbac: 'none',
          },
          validate: {
            payload: Joi.object({
              username: Joi.string().required().trim()
                .description('用户名')
                .error(() => new Error('用户名必须填写')),
              password: Joi.string().required()
                .description('密码')
                .error(() => new Error('密码必须填写')),
            }),
          },
        },
      },
      { // 获取用户
        method: 'get',
        path: `/${GROUP_NAME}`,
        handler: getUsers,
        config: {
          notes: '获取用户',
          description: '获取用户',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            query: Joi.object({
              page: Joi.number().integer().min(1).default(1)
                .description('页码：默认第1页，最小值为1')
                .error(() => new Error('页码：默认第1页，最小值为1')),
              perPage: Joi.number().integer().min(1).default(10)
                .description('每页的记录数：默认10条，最小值为1')
                .error(() => new Error('每页的记录数：默认10条，最小值为1')),
              searchField: Joi.string().allow('phone', 'email', 'username')
                .default('')
                .description('要搜索的字段')
                .error(() => new Error('请填写要搜索的字段')),
              searchValue: Joi.string().default('')
                .description('要搜索的内容')
                .error(() => new Error('请填写要搜索的内容')),
            }),
          },
        },
      },

      { // 添加用户
        method: 'post',
        path: `/${GROUP_NAME}`,
        handler: addUser,
        config: {
          notes: '添加用户',
          description: '添加用户',
          tags: ['api', GROUP_NAME],
          plugins: {
            'hapi-swagger': {
              payloadType: 'form',
            },
          },
          validate: {
            headers,
            payload: Joi.object({
              username: Joi.string().required().regex(/\w{2,18}/).trim()
                .description('用户:2-18个字母数字组合')
                .error(() => new Error('用户:2-18个字母数字组合')),
              email: Joi.string().required().email().description('邮箱'),
              password: Joi.string().required().min(6).max(18)
                .description('密码:6-18个字符')
                .error(() => new Error('密码:6-18个字符')),
              phone: Joi.string().required().regex(/^1[3456789]\d{9}$/)
                .description('手机')
                .error(() => new Error('手机格式错误')),
              gender: Joi.string().required().allow('0', '1')
                .description('性别:0:女,1:男')
                .error(() => new Error('性别必须填写:0:女,1:男')),

              // group: Joi.array().required().description('所属组'),
            }),
          },
        },
      },

      { // 根据id获取单个用户信息
        method: 'GET',
        path: `/${GROUP_NAME}/{id}`,
        handler: getUserById,
        config: {
          notes: '根据ID获取单个用户信息',
          description: '根据ID获取单个用户信息',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('用户id')
                .error(() => new Error('用户id未填写或格式错误')),
            }),
          },
        },
      },
      { // 获取登陆用户信息
        method: 'GET',
        path: `/${GROUP_NAME}/logined`,
        handler: getUserLogined,
        config: {
          notes: '获取登陆用户信息',
          description: '获取登陆用户信息',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
          },
        },
      },

      { // 根据ID删除用户
        method: 'delete',
        path: `/${GROUP_NAME}/{id}`,
        handler: deleteUserById,
        config: {
          notes: '根据ID删除用户',
          description: '根据ID删除用户',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('用户id')
                .error(() => new Error('用户id未填写或格式错误')),
            }),
          },
        },
      },

      { // 根据多个ID批量删除用户
        method: 'delete',
        path: `/${GROUP_NAME}`,
        handler: deleteUsersByIds,
        config: {
          notes: '根据多个ID批量删除用户',
          description: '根据多个ID批量删除用户',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            payload: Joi.object({
              ids: Joi.array().required().items(
                Joi.string().hex().length(24).required()
                  .description('用户id')
                  .error(() => new Error('用户id未填写或格式错误')),
              ),
            }),
          },
        },
      },

      { // 根据ID编辑用户信息
        method: 'put',
        path: `/${GROUP_NAME}/{id}`,
        handler: updateUserById,
        config: {
          notes: '根据ID更新用户信息',
          description: '根据ID更新用户信息',
          tags: ['api', GROUP_NAME],
          plugins: {
            'hapi-swagger': {
              payloadType: 'form',
            },
          },
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('用户id')
                .error(() => new Error('用户id未填写或格式错误')),
            }),
            payload: Joi.object({
              username: Joi.string().regex(/\w{2,18}/).trim()
                .description('用户:2-18个字母数字组合')
                .error(() => new Error('用户:2-18个字母数字组合')),
              email: Joi.string().email()
                .description('邮箱')
                .error(() => new Error('邮箱格式错误')),
              phone: Joi.string().regex(/^1[3456789]\d{9}$/)
                .description('手机')
                .error(() => new Error('手机格式错误')),

              gender: Joi.string().allow('0', '1')
                .description('性别:0:女,1:男')
                .error(() => new Error('性别:0:女,1:男')),
              // group: Joi.array().single()
              //   .description('所属组'),
            }),
          },
        },
      },
      { // 编辑登陆用户信息
        method: 'put',
        path: `/${GROUP_NAME}/logined`,
        handler: updateUserLogined,
        config: {
          notes: '编辑登陆用户信息',
          description: '编辑登陆用户信息',
          tags: ['api', GROUP_NAME],
          plugins: {
            'hapi-swagger': {
              payloadType: 'form',
            },
          },
          validate: {
            headers,
            payload: Joi.object({
              username: Joi.string().regex(/\w{2,18}/).trim()
                .description('用户:2-18个字母数字组合'),
              email: Joi.string().email()
                .description('邮箱')
                .error(() => new Error('邮箱格式错误')),
              phone: Joi.string().regex(/^1[3456789]\d{9}$/)
                .description('手机')
                .error(() => new Error('手机格式错误')),
              gender: Joi.string().allow('0', '1')
                .description('性别:0:女,1:男')
                .error(() => new Error('性别:0:女,1:男')),
            }),
          },
        },
      },
      { // 判断字段值是否存在
        method: 'get',
        path: `/${GROUP_NAME}/exist`,
        handler: isExist,
        config: {
          notes: '判断字段值是否存在',
          description: '判断字段值是否存在',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            query: Joi.object({
              field: Joi.string().required().allow('phone', 'email', 'username')
                .description('字段名')
                .error(() => new Error('字段名必须填写')),
              value: Joi.string().required()
                .description('值')
                .error(() => new Error('值必须填写')),
            }),
          },
        },
      },
    ]);
  },
};
